package com.hnit.applet.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateUtils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description:
 * @Author: chang_hy
 * @Date: 2022/4/24 15:45
 * @Versions 1.0.0
 **/
@Slf4j
public class DateUtil {

    public static String dateFormat(Date date, String pattern) {
        return new SimpleDateFormat(pattern).format(date);
    }

    /***
     * @Author chang_hy
     * @Description 获取过去几天的日期集合(含当天)
     * @Date 2022/5/13 16:47
     * @param time 当前日期
     * @param num 天数
     * @param pattern 日期格式
     */
    public static List<String> getDate(String time, int num, String pattern) {
        ArrayList<String> pastDaysList = new ArrayList<>();
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        try {
            for (int i = 0; i < num; i++) {
                Date date = DateUtils.addDays(format.parse(time), -i);
                String dateFormat = format.format(date);
                pastDaysList.add(dateFormat);
            }
        } catch (ParseException e) {
            log.error("日期装换异常");
            e.printStackTrace();
        }
        return pastDaysList.stream().sorted().collect(Collectors.toList());
    }

    /**
     * 获取两个日期之间的所有日期
     *
     * @param start 开始时间
     * @param end   结束时间
     *
     * @return 日期集合
     */
    private static List<Date> getDays(Date start, Date end) {
        List<Date> result = new ArrayList<>();
        Calendar tempStart = Calendar.getInstance();
        tempStart.setTime(start);
        tempStart.add(Calendar.DAY_OF_YEAR, 1);

        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(end);
        while (tempStart.before(tempEnd)) {
            result.add(tempStart.getTime());
            tempStart.add(Calendar.DAY_OF_YEAR, 1);
        }
        return result;
    }

    /**
     * 获取两个日期之间的所有日期
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     *
     * @return 日期集合
     */
    public static List<String> getDays(String startTime, String endTime) {
        return getDays(startTime, endTime, "yyyy-MM-dd");
    }

    /**
     * 获取两个日期之间的所有日期
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     *
     * @return 日期集合
     */
    public static List<String> getDays(String startTime, String endTime, String fmt) {

        // 返回的日期集合
        List<String> days = new ArrayList<>();

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        DateFormat dateFormat1 = new SimpleDateFormat(fmt);
        try {
            Date start = dateFormat.parse(startTime);
            Date end = dateFormat.parse(endTime);

            Calendar tempStart = Calendar.getInstance();
            tempStart.setTime(start);

            Calendar tempEnd = Calendar.getInstance();
            tempEnd.setTime(end);
            // 日期加1(包含结束)
            tempEnd.add(Calendar.DATE, +1);
            while (tempStart.before(tempEnd)) {
                days.add(dateFormat1.format(tempStart.getTime()));
                tempStart.add(Calendar.DAY_OF_YEAR, 1);
            }

        } catch (ParseException e) {
            e.printStackTrace();
        }

        return days;
    }
}
